﻿using System;

namespace Core
{
    //public interface IDataElement
    //{
    //    Vector2Int Coord { get; set; }
    //}

    /// <summary>
    /// 数据源
    /// 
    /// 二维数组，对T[,]的封装
    /// 
    /// 增加对元素索引和遍历等扩展功能
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DataSource<T> : DataView<T>
    {
        public DataSource(int w, int h) : base(w, h) { }

        public override void Clear()
        {
            for (int i = 0; i < W; i++)
            {
                for (int j = 0; j < H; j++)
                {
                    var t = Data[i, j];
                    if (t is IDisposable t1)
                    {
                        t1?.Dispose();
                    }

                    if (t is IDispose t2)
                    {
                        t2?.Dispose();
                    }
                }
            }
            Array.Clear(Data, 0, W * H);
        }

        public void ClearElements()
        {
            Array.Clear(Data, 0, W * H);
        }

        /// <summary>
        /// 创建元素
        /// </summary>
        /// <param name="func"></param>
        public void CreateElements(Func<int, int, T> func)
        {
            if (func == null) return;

            for (int j = 0; j < H; j++)
            {
                for (int i = 0; i < W; i++)
                {
                    this[i, j] = func(i, j);
                }
            }
        }


        ///// <summary>
        ///// 遍历ele节点的周围第num圈节点
        ///// 不包括圈内节点
        ///// 不返回自身节点
        ///// 不返回无效节点
        ///// 
        ///// 若需要包括圈内节点的方法，请调用ForRountIn方法
        ///// </summary>
        ///// <param name="ele"></param>
        ///// <param name="func"></param>
        ///// <param name="num">以ele为中心向外第num圈，默认为1</param
        //public void ForRoundOn(IDataElement ele, Action<T> func, int num = 1)
        //{
        //    ForRoundOn(ele.Coord.x, ele.Coord.y, func, num);
        //}


        ///// <summary>
        ///// 遍历ele节点的周围num圈节点
        ///// 包括圈内节点
        ///// 不返回自身节点
        ///// 不返回无效节点
        ///// 
        ///// 若需要不包括圈内节点的方法，请调用ForRountOn方法
        ///// </summary>
        ///// <param name="ele"></param>
        ///// <param name="func"></param>
        ///// <param name="num">圈数，默认为1</param>
        //public void ForRoundIn(IDataElement ele, Action<T> func, int num = 1)
        //{
        //    ForRoundIn(ele.Coord.x, ele.Coord.y, func, num);
        //}

        ///// <summary>
        ///// 统计ele节点周围满足条件的节点个数，
        ///// 默认返回周围有效的节点数，
        ///// 不包含自身(x,y)节点
        ///// </summary>
        ///// <param name="ele"></param>
        ///// <param name="func"></param>
        ///// <returns></returns>
        //public int CountRound(IDataElement ele, Func<T, bool> func)
        //{
        //    return CountRound(ele.Coord.x, ele.Coord.y, func);
        //}
    }
}
